package com.kinsin.kinsinutil

import android.content.Context
import android.os.SystemClock
import android.view.View

/**
 * 防抖点击事件
 * @author kinsin
 *
 * 使用示例：
 * view.setSafeClickListener(
 * interval = 500,
 * preCheck = { context ->
 *     HisHandleManager.getInstance().nbIsExprid != 2
 *             && !LonbonAccountPeriodManager.showAccountPeriodTip(context)
 * },
 * onQuickClick = { context ->
 *     context?.let {
 *         Toast.makeText(it, "Custom warning", Toast.LENGTH_SHORT).show()
 *     }
 * }
 * ) {
 *     // 实际点击处理逻辑
 * }
 */
class SafeClickListener(
    /**
     * 防抖时间间隔（毫秒）
     * - 默认：300ms（符合 Material Design 的点击响应建议时长）
     * - 特殊场景建议：
     *   按钮连续操作场景建议 500-800ms
     *   关键操作（如支付）建议 1000ms
     */
    private val interval: Long = 300,
    /**
     * 实际点击事件处理逻辑（必需参数）
     * @param View 被点击的视图对象
     * 注意：该lambda在通过防抖和preCheck验证后才会执行
     * 示例：{ view -> startActivity(Intent(context, DetailActivity::class.java)) }
     */
    private val block: (View) -> Unit,
    /**
     * 点击前置条件检查器（可选参数）
     * @param Context? 关联的上下文（自动从View中获取，可能为null）
     * @return Boolean 是否允许点击：
     *   true = 允许进入防抖验证
     *   false = 直接阻断点击事件
     * 典型使用场景：
     * - 权限检查（摄像头、定位等）
     * - 登录状态验证
     * - 网络状态检查
     * 默认：无条件允许点击（默认返回true）
     */
    private val preCheck: (Context?) -> Boolean = { true },
    /**
     * 快速点击时的回调处理（可选参数）
     * @param Context? 关联的上下文
     * 默认：空操作
     * 常见用法：
     * - 显示"操作过快"提示
     * - 记录点击过快埋点
     * - 播放禁止音效
     * 示例：{ context ->
     *   Toast.makeText(context, "操作间隔需超过${interval}ms", LENGTH_SHORT).show()
     * }
     */
    private val onQuickClick: (Context?) -> Unit = { context ->
    }
) : View.OnClickListener {

    private var lastClickTime = 0L

    override fun onClick(v: View) {
        if (!preCheck(v.context)) return

        val currentTime = SystemClock.elapsedRealtime()
        if (currentTime - lastClickTime > interval) {
            lastClickTime = currentTime
            block(v)
        } else {
            onQuickClick(v.context)
        }
    }
}

// 扩展函数用法
fun View.setSafeClickListener(
    interval: Long = 300,
    preCheck: (Context?) -> Boolean = { true },
    onQuickClick: (Context?) -> Unit = { context ->

    },
    block: (View) -> Unit
) {
    setOnClickListener(SafeClickListener(interval, block, preCheck, onQuickClick))
}